<?php
/*
Plugin Name: WP GMaps Entry
Plugin URI: 
Description: ktai_entryにgmaps表示構文を追加する。当プラグインを使用する為には、ktai_entryが必要です。
Version: 0.2
Author: Tatsuya Fukata
Author URI: http://fukata.org
*/
define('WPGE_SET_MAP_LAT', 'Lat:');
define('WPGE_SET_MAP_LNG', 'Lon:');
define('WPGE_MAPS_API_KEY', 'ABQIAAAAjSA8EzT1dHiGizeGqYxYAxTIhauOHxW_rBwzYA_GbmansyIERRQH1JFE-hs2wvybChgNlfycRlXC2w');
define('WPGE_MAP_WIDTH', 400);
define('WPGE_MAP_HEIGHT', 400);
define('WPGE_MAP_ZOOM', 16);

/**
 * ktai_entryから投稿された場合にGMapsコードを挿入する。
 * @param $post_name
 * @param $contents
 * @return unknown_type
 */
function wpge_do_filter_post_ktai_entry($post_name, &$contents) {
	
	$latMatches = null;
	$lonMatches = null;
	// Lat
	if (preg_match('/' . preg_quote(WPGE_SET_MAP_LAT, '/') . '(.*)$/m', $contents->text, $latMatches)) {
	}
	// Lon
	if (preg_match('/' . preg_quote(WPGE_SET_MAP_LNG, '/') . '(.*)$/m', $contents->text, $lonMatches)) {
	}
	
	if (wpge_is_gps_point($latMatches[1]) && wpge_is_gps_point($lonMatches[1])) {
		$lat = $latMatches[1];
		$lon = $lonMatches[1];
//		$mapHtml = '<div class="map"><img src="http://maps.google.com/staticmap?center='.$lat.','.$lon.'&'.
//					'zoom='.WPGE_MAP_ZOOM.'&size='.WPGE_MAP_WIDTH.'x'.WPGE_MAP_HEIGHT.'&maptype=mobile&'.
//					'markers='.$lat.','.$lon.'&key='.WPGE_MAPS_API_KEY.'&sensor=false"/></div>';
		$mapHtml = "\n".'[map lat='.$lat.',lon='.$lon.']';
		// 置換対象文字列を削除
		$contents->text = preg_replace('/' . preg_quote(WPGE_SET_MAP_LAT, '/') . '(.*)\n?/m', '', $contents->text);
		$contents->text = preg_replace('/' . preg_quote(WPGE_SET_MAP_LNG, '/') . '(.*)\n?/m', '', $contents->text);
		
		$contents->text .= $mapHtml;
	}
	return $post_name;
}

/**
 * GPSポイントとして正しい値かどうか判定を行う。
 * @param unknown_type $value
 * @return unknown_type
 */
function wpge_is_gps_point($value) {
	if (is_string($value) && is_numeric($value)) {
		$value = floatval($value);
	} else if (is_numeric($value)) {
		$value = floatval($value);
	} else {
		return false;
	}
	
	if (!is_float($value)) {
		return false;
	}
	
	return true;
}

/**
 * 
 * @param unknown_type $content
 * @return unknown_type
 */
function wpge_do_insert_gmap_code($content) {
	global $id;
	
	// 入力コードの解析
	$option = wpge_code_parse($content);
//	var_dump($option);
	
	// HTML挿入コードの生成
	$mapHtml = '';
	$mapHtml .= '<div id="map-'.$id.'" style="width:'.$option->width.'px;height:'.$option->height.'px"></div>'."\n";
	$mapHtml .= '<script type="text/javascript"><!--'."\n";
	$mapHtml .= 'var map = new GMap2(document.getElementById("map-'.$id.'"));'."\n";
	$mapHtml .= 'var center = new GLatLng('.$option->lat.', '.$option->lon.');'."\n";
	$mapHtml .= 'map.setCenter(center, '.$option->zoom.');'."\n";
	$mapHtml .= 'map.addOverlay(new GMarker(center));'."\n";
	$mapHtml .= '//-->'."\n";
	$mapHtml .= '</script>'."\n";
	$mapHtml .= '<noscript>'."\n";
	$mapHtml .= '<div class="map"><img src="http://maps.google.com/staticmap?center='.$option->lat.','.$option->lon.'&'.
					'zoom='.$option->zoom.'&size='.$option->width.'x'.$option->height.'&maptype=mobile&'.
					'markers='.$option->lat.','.$option->lon.'&key='.WPGE_MAPS_API_KEY.'&sensor=false"/></div>'."\n";
	$mapHtml .= '</noscript>'."\n";
	
	$content = preg_replace('/\[map ' .
				'((lat)=([-+]?[0-9]+[\.[0-9]*]?|[\.[0-9]+]),?\s*)?'.
				'((lon)=([-+]?[0-9]+[\.[0-9]*]?|[\.[0-9]+]),?\s*)?'.
				'((zoom)=([0-9]+),?\s*)?'.
				'((width)=([0-9]+),?\s*)?'.
				'((height)=([0-9]+),?\s*)?'.
				'\]/m', $mapHtml, $content);
	
	return $content;
}

/**
 * GMap挿入コードを解析する。
 * @param unknown_type $text
 * @return unknown_type
 */
function wpge_code_parse($content) {
	// 初期化
	$option = new stdClass();
	$option->lat = null;
	$option->lon = null;
	$option->zoom = null;
	$option->width = null;
	$option->height = null;
	
	$matches = null;
	preg_match('/\[map ' .
				'((lat)=([-+]?[0-9]+[\.[0-9]*]?|[\.[0-9]+]),?\s*)?'.
				'((lon)=([-+]?[0-9]+[\.[0-9]*]?|[\.[0-9]+]),?\s*)?'.
				'((zoom)=([0-9]+),?\s*)?'.
				'((width)=([0-9]+),?\s*)?'.
				'((height)=([0-9]+),?\s*)?'.
				'\]/m', $content, $matches);
//	var_dump($matches);
	
	$option->lat = wpge_get_option($matches, 'lat', null, '([-+]?[0-9]+[\.[0-9]*]?|[\.[0-9]+])');
	$option->lon = wpge_get_option($matches, 'lon', null, '([-+]?[0-9]+[\.[0-9]*]?|[\.[0-9]+])');
	$option->zoom = wpge_get_option($matches, 'zoom', WPGE_MAP_ZOOM, '([0-9]+)');
	$option->width = wpge_get_option($matches, 'width', WPGE_MAP_WIDTH, '([0-9]+)');
	$option->height = wpge_get_option($matches, 'height', WPGE_MAP_HEIGHT, '([0-9]+)');

	return $option;
}

/**
 * 挿入コードの値を取得する。
 * @param unknown_type $matches
 * @param unknown_type $key
 * @param unknown_type $default
 * @param unknown_type $regex
 * @return unknown_type
 */
function wpge_get_option($matches, $key, $default=null, $regex=null) {
	$value = $default;
	for ($i=0; $i<count($matches); $i++) {
		if ($matches[$i]==$key) {
			if ($i+1<count($matches) && ($regex==null || preg_match('/'.$regex.'/',$matches[$i+1]))) {
				$value = $matches[$i+1];
			}
		}
	}
	return $value;
}

add_filter('post_name/ktai_entry.php', 'wpge_do_filter_post_ktai_entry',10,3);
add_filter('the_content', 'wpge_do_insert_gmap_code',10,3);

//$text =<<<_EOS_
//<p>[map lat=33.234567,lon=128.234567,zoom=16,width=400,height=400]</p>
//_EOS_;
//var_dump (wpge_do_insert_gmap_code($text));
?>